package com.doctracker.model;

import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;

import java.util.List;
import java.util.ArrayList;
import java.time.LocalDateTime;

/**
 * 扫描结果类
 * 用于存储文件扫描的结果信息
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ScanResult {
    
    /**
     * 人员列表
     */
    private List<Person> people = new ArrayList<>();
    
    /**
     * 扫描的文件夹列表
     */
    private List<String> folders = new ArrayList<>();
    
    /**
     * 已提交人数
     */
    private int submittedCount;
    
    /**
     * 总人数
     */
    private int totalCount;
    
    /**
     * 扫描时间
     */
    private LocalDateTime scanTime;
    
    /**
     * 扫描到的文件总数
     */
    private int totalFileCount;
    
    /**
     * 获取未提交人数
     * @return 未提交人数
     */
    public int getUnsubmittedCount() {
        return totalCount - submittedCount;
    }
    
    /**
     * 获取提交率
     * @return 提交率（百分比）
     */
    public double getSubmissionRate() {
        if (totalCount == 0) {
            return 0.0;
        }
        return (double) submittedCount / totalCount * 100;
    }
    
    /**
     * 获取提交率文本
     * @return 格式化的提交率文本
     */
    public String getSubmissionRateText() {
        return String.format("%.1f%%", getSubmissionRate());
    }
    
    /**
     * 获取统计摘要文本
     * @return 统计摘要
     */
    public String getSummaryText() {
        return String.format("已提交: %d人 (%s) | 未提交: %d人", 
            submittedCount, getSubmissionRateText(), getUnsubmittedCount());
    }
    
    /**
     * 更新统计数据
     */
    public void updateStatistics() {
        this.totalCount = people.size();
        this.submittedCount = (int) people.stream()
            .mapToInt(person -> person.isHasSubmitted() ? 1 : 0)
            .sum();
        this.scanTime = LocalDateTime.now();
    }
    
    /**
     * 获取已提交的人员列表
     * @return 已提交人员列表
     */
    public List<Person> getSubmittedPeople() {
        return people.stream()
            .filter(Person::isHasSubmitted)
            .toList();
    }
    
    /**
     * 获取未提交的人员列表
     * @return 未提交人员列表
     */
    public List<Person> getUnsubmittedPeople() {
        return people.stream()
            .filter(person -> !person.isHasSubmitted())
            .toList();
    }
} 